/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package compilador.analisadorSintatico.operacoes;

import compilador.analisadorLexico.PalavraReservada;
import compilador.analisadorLexico.Token;
import compilador.analisadorLexico.TokenClass;
import compilador.analisadorSintatico.Producao;
import compilador.analisadorSintatico.TokenReader;
import compilador.analisadorSintatico.metodos.CHAMADA_METODO;
import compilador.analisadorSintatico.metodos.VARIAVEL;
import compilador.analisadorSintatico.simboloGramatical.NaoTerminal;
import compilador.analisadorSintatico.simboloGramatical.SimboloGramatical;
import compilador.analisadorSintatico.simboloGramatical.Terminal;

/**
 *
 * @author Joao
 */
public class NRO extends Producao {

    //<NRO> ::= [ '-' ] ( num | <CHAMADA_METODO> | <VARIAVEL> )
    @Override
    public void setSimbolo() {
        this.simbolo = new NaoTerminal(this.getClass().getSimpleName());
    }

    @Override
    public SimboloGramatical derivar() throws Exception {

        TokenReader tokenReader = TokenReader.getInstance();

        Token t = tokenReader.seeCurrent();

        //Identifica primeiro se tem o menos
        if (t.getTokenClass().equals(TokenClass.OPERADOR) && t.getAtributo().equals("-")) {
            ((NaoTerminal) this.simbolo).add(new Terminal(t));
            tokenReader.consome();
            t = tokenReader.seeCurrent();
        }

        if (t.getTokenClass().equals(TokenClass.NUMERO)) {
            ((NaoTerminal) this.simbolo).add(new Terminal(t));
            tokenReader.consome();

        } else if (t.getTokenClass().equals(TokenClass.IDENTIFICADOR)) {
            //Aqui é um LL2
            Token proximo = tokenReader.seeNext();

            if (proximo.getAtributo().equals("(")) {
                //Pode ser uma chamada de método
                ((NaoTerminal) this.simbolo).add(new CHAMADA_METODO().derivar());
            } else {
                //Pode ser uma variável
                ((NaoTerminal) this.simbolo).add(new VARIAVEL().derivar());
            }
        }else if(t.getAtributo().equals(PalavraReservada.WRITE) || t.getAtributo().equals(PalavraReservada.READ)){
            ((NaoTerminal) this.simbolo).add(new CHAMADA_METODO().derivar());
            
        }else{
            erro("Valor próximo a '" + t.getAtributo().toString() + "' não pôde ser reconhecido. Linha " + t.getLinha() + ".");
            return this.simbolo;
        }

        return ((NaoTerminal) this.simbolo);
    }
}
